package com.azt.api.service;

import java.util.List;
import java.util.Map;

import com.azt.api.dto.UserAuthority;
import com.azt.api.pojo.Authority;
import com.azt.api.pojo.Company;
import com.azt.api.pojo.Role;
import com.azt.api.pojo.User;
import com.azt.api.pojo.UserRole;
import com.azt.model.page.Pagination;

/** 
 * @ClassName: UserPermissionService 主要操作的是role dept接口
 * @Description: TODO
 * @author: zhaheng
 * @date: 2016年9月2日 上午10:49:08  
 */
public interface UserPermissionService {


	/**
	 * @description 由名称查询
	 * @param udeptname
	 * @return
	 * @author 查恒  2016年8月10日上午9:18:38
	 */

	/**
	 * @description 查询角色
	 * @param id
	 * @return
	 * @author 查恒  2016年8月10日下午11:11:27
	 */
	Role getRoleById(Integer roleid);

	/**
	 * @description 更新角色
	 * @param roleById
	 * @author 查恒  2016年8月10日下午11:17:56
	 */
	void updateRole(Role roleById);

	/**
	 * @description 保存创建的角色
	 * @param role
	 * @author 查恒  2016年8月10日下午11:35:11
	 */
	void saveRole(Role role);

	/**
	 * 判断某个role是否具有某个菜单的权限
	 * @type 1. and   2. or
	 * */
	boolean hasThisPerm(int roleId, String[] codes, int type);

	/**
	 * @description 查询部门下的角色列表
	 * @param i
	 * @param j
	 * @param searchMap
	 * @return
	 * @author 查恒  2016年8月11日上午9:21:50
	 */
	Pagination getRoleModelByPage(int pageNo, int pageSize, Map<String, String> searchMap);

	/**
	 * @description 删除角色
	 * @param roleById
	 * @author 查恒  2016年8月11日上午10:06:42
	 */
	void deleteRole(Role roleById);


	/**
	 * @description 根据roleType拿对象   如果为注册用户（roletype为3的）应该只有一条记录，取List下标0即可
	 * @param roletype
	 * @return
	 * @author 查恒  2016年8月17日下午4:36:53
	 */
	List<Role> getRoleByRoleType(int roletype);
	
	/** 
	 * @Title: getRoleByCompanyId 
	 * @Description: TODO
	 * @return
	 * @return: List<Role>
	 * @author: 查恒 2016年10月9日 上午10:02:26 
	 */
	List<Role> getRoleByCompanyId(Integer companyId);

	List<Role> getRoleByCompanyIdType(Integer companyId,Integer RoleType);
	/**
	 * 获取用户的所有角色
	 * */
	List<Role> findRoleByUserId(int userId);


	/**
	 * 判断用户是否有供应商的角色
	 *
	 * @param userId
	 * @return
	 */
	boolean ifProviderRole(int userId);
	
	/** 
	 * @Title: getAllRole 
	 * @Description: 得到默认的所有的角色
	 * @return
	 * @return: List<Role>
	 * @author: 查恒 2016年9月14日 上午11:11:52 
	 */
	List<Role> getAllRole();
	
	/** 
	 * @Title: getIfAdminRole 
	 * @Description:获取默认管理员除了领导
	 * @return
	 * @return: List<Role>
	 * @author: 查恒 2016年10月9日 下午2:55:28 
	 */
	List<Role> getIfAdminRole();
	
	/** 
	 * @Title: 根据id查询
	 * @Description: TODO
	 * @param id
	 * @return
	 * @return: UserRole
	 * @author: 查恒 2016年9月2日 下午3:14:54 
	 */
	UserRole getUserRoleById(Integer id);
	
	/** 
	 * @Title: insertUserRole 
	 * @Description:  插入u_user_role记录
	 * @param userId
	 * @param roleId
	 * @return: void
	 * @author: 尚文强 2016年9月2日 上午10:00:51 
	 */
	void insertUserRole(int userId, int roleId);

	/** 
	 * @Title: 保存角色关系 
	 * @Description: TODO
	 * @param userRole
	 * @return: void
	 * @author: 查恒 2016年9月2日 下午3:06:27 
	 */
	void saveUserRole(UserRole userRole);
	/** 
	 * @Title: 删除角色关系
	 * @Description: TODO
	 * @param userRole
	 * @return: void
	 * @author: 查恒 2016年9月2日 下午3:06:30 
	 */
	void deleteUserRole(UserRole userRole);
	
	/**
	 * @description 根据用户的userId和 用户类别查询是否有这个功能权限  --可公用方法
	 * @param userId
	 * @param roleType
	 * @param funcId
	 * @return
	 * @author 查恒  2016年8月19日下午1:14:36
	 */
	Boolean TestUserFunction(Integer userId,Integer roleType,Integer funcId);
	
	
	 /***
	 * @description 审核通过分配身份方法  根据companyId  --可公用方法  
	 * 业务逻辑：
	 * 根据companyId 查到对应的role 
	 * 第一次审核通过，应是注册用户，删除注册用户的userrole关系，根据配置的采购商或供应商分配默认管理员角色关系
	 * 第二次审核通过，应是管理员，不管
	 * @return
	 * @author 查恒  2016年9月2日上午9:59:48
	 */
	void ReviewedUserRole(Integer companyId);

	/**
	 * 获取公司下面非管理员角色
	 * */
    List<Role> findRoleNotAdmin(int companyId);

    /**
	 * @description 创建新用户步骤1：根据Code取得角色的对象  --公共方法
	 * @param code
	 * @return
	 * @author 查恒  2016年8月19日上午9:07:30
	 */
	Role getRoleByCode(String code);
	
	
	/**
	 * @description 创建新用户步骤4：根据新role和userid生成u_use_role新角色关系 --可公用方法
	 * @return
	 * @author 查恒  2016年9月2日上午11:59:48
	 */
	void createUserRole(Role role,User user);

	/**
	 * @description 创建新用户步骤6：  --可公用方法
	 * @return
	 * @author 查恒  2016年9月2日上午11:59:48
	 */
	UserRole getUserRoleByRoleId(Integer roleId, Integer userId);

	/** 
	 * @Title: getUserRoleByRoleId 
	 * @Description: 根据RoleId查到多个user
	 * @return
	 * @return: UserRole
	 * @author: 查恒 2016年10月9日 上午11:46:12 
	 */
	List<UserRole> getUserRolesByRoleId(Integer roleId);
	
	/** 
	 * @Title: getUserRole 
	 * @Description: 拿到原先的userrole关系表，根据是否管理员的roleId
	 * @param companyId
	 * @param ifAdminRole
	 * @return
	 * @return: List<UserRole>
	 * @author: 查恒 2016年10月9日 下午4:24:14 
	 */
	List<UserRole> getUserRoleByAdmin(Integer companyId, List<Role> ifAdminRole);


	/** 
	 * @Title: getRoleByParameter 
	 * @Description: 根据Role的参数查询  公共方法
	 * @param parameter
	 * @return: void
	 * @author: 查恒 2016年10月20日 上午10:30:22
	 */
	List<Role> getRoleByParameter(Map parameter);

	/** 
	 * @Title: getNonDefaultRoles 
	 * @Description: 获取到非默认的角色  参数是所有的角色
	 * @param roles
	 * @return
	 * @return: List<Role>
	 * @author: 查恒 2016年10月26日 下午5:18:14 
	 */
	List<Role> getNonDefaultRoles(List<Role> roles);

	/** 
	 * @Title: saveOrUpdateRoleAuthority 
	 * @Description: 保存角色  前台组织架构
	 * @param role
	 * @return: void
	 * @author: 查恒 2016年10月27日 下午3:51:49 
	 */

	void saveOrUpdateRoleAuthority(Company company, Map<String, Object> parseMap, Role role);

	/** 
	 * @Title: searchNotDefaultRoles 
	 * @Description: 角色页面分页
	 * @param i
	 * @param j
	 * @param notDefaultRoles
	 * @return
	 * @return: Pagination
	 * @author: 查恒 2016年11月17日 下午4:30:05 
	 */
	Pagination searchNotDefaultRoles(int pageNo, int pageSize, Integer companyId, Integer roleType);

	/** 
	 * @Title: quitCompany 
	 * @Description: 退出公司方法
	 * @param user
	 * @param role
	 * @return: void
	 * @author: 查恒 2016年12月16日 下午2:06:59 
	 */
	Role quitCompany(User user, List<Role> role);


}
